package com.czy.server;

import com.czy.model.Entity;
import com.czy.model.Mapping;

import java.util.List;
import java.util.Map;

/**
 * @author czy
 * @date 2021-5-26 17:33
 */
public class WebApp {
    private static ServletContext contxt;
    static{
        contxt=new ServletContext();
        //分别获取对应关系的Map集合
        Map<String,String> servlet=contxt.getServlet();
        Map<String,String> mapping=contxt.getMapping();
        //创建解析XML文件对象
        WebDom4j web=new WebDom4j();
        web.parse(web.getDocument());//解析xml
        //获取解析XML之后的List集合
        List<Entity> entityList=web.getEntityList();
        List<Mapping> mappingList=web.getMappingList();

        //将List集合中的数据存储到Map集合
        for (Entity entity : entityList) {
            servlet.put(entity.getName(), entity.getClazz());
        }
        //	System.out.println(servlet);
        for( Mapping map:mappingList){
            //遍历url-pattern的集合
            List<String> urlPattern=map.getUrlPattern();
            for(String s:urlPattern){
                mapping.put(s, map.getName());
            }
        }
        //System.out.println(mapping);
    }
    /**
     * 根据url创建不同的Servlet对象
     * @param url
     * @return
     */
    public static Servlet getServlet(String url){
        if (url==null||url.trim().equals("")) {
            return null;
        }
        //调用无参构造方法创建Servlet对象

        try {
            //如果url正确
            //根据url的key获取servlet-name的值 /log=login, /reg=register
            String servletName=contxt.getMapping().get(url);
            //根据servletName得到对应的servlet-class
            String servletClass=contxt.getServlet().get(servletName);  //得到的是一个完整个的包名+类的字符串
            //使用反射创建 Servlet对象
            Class<?> clazz=Class.forName(servletClass);
            Servlet servlet = (Servlet) clazz.newInstance();
            return servlet;
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }
    //测试
    public static void main(String[] args) {
        System.out.println(getServlet("/log"));
        System.out.println(getServlet("/login"));
    }
}
